Flutter 问题及解决方案汇总.


图腾


Flutter 问题 以及 解决方案

包含:遇到的常见问题,以及问题的解决方案,的汇总列表


帮助Flutter开发者解决疑问问题、帮助开发者精通Flutter,并开发Flutter!

1.Scaffold Problems

1. Scaffold.of() called with a context that does not contain a Scaffold

问题描述: 通过使用Scaffold.of(context)来显示“Drawer”、“SnackBar”等widget时,出现上述问题
解决方案:

*出现问题的代码

class BasicWidget extends StatelessWidget {
    @override
    Widget build(BuildContext context) {

        return new Scaffold(
            appBar: new AppBar(
            title: new Text("Basic Widget"),
            ),
            body: new Column(
            children: <Widget>[
                new RaisedButton(
                onPressed: () {
                    final snackBar = new SnackBar(
                    content: new Text("这是一个Snackbar"),
                    action: new SnackBarAction(
                        label: "Undo",
                        onPressed: (){

                    }),
                    );
                    Scaffold.of(context).showSnackBar(snackBar);
                },
                child: new Text("显示Snackbar"),
                )
            ],
            ));
    }
}

*解决问题的代码

class BasicWidget extends StatelessWidget {
    @override
    Widget build(BuildContext context) {

        return new Scaffold(
            appBar: new AppBar(
            title: new Text("Basic Widget"),
            ),
            body: new Builder(builder: (BuildContext context){
            return new Column(
                        children: <Widget>[
                    new RaisedButton(
                    onPressed: () {
                        final snackBar = new SnackBar(
                        content: new Text("这是一个Snackbar"),
                        action: new SnackBarAction(
                            label: "Undo",
                            onPressed: (){

                        }),
                        );
                        Scaffold.of(context).showSnackBar(snackBar);
                    },
                    child: new Text("显示Snackbar"),
                    )
                ],
            );
        }),
    );
}
}

2.AppBar Problems

1. AppBar ‘尺寸、宽/高度’的修改

*解决问题的代码

PreferredSizeWidget appBarBottom = TabBar(
  tabs: [
    Tab(
      text: "one",
      icon: Icon(Icons.find_in_page),
    ),
    Tab(
      text: "two",
      icon: Icon(Icons.find_in_page),
    ),
  ],
);

return DefaultTabController(
  length: 2,
  child: Scaffold(
    appBar: PreferredSize(
      child: AppBar(
        bottom: appBarBottom,
      ),
      preferredSize: Size.fromHeight(appBarBottom?.preferredSize?.height),
    ),
    body: TabBarView(
      children: [
        child,
        child,
      ],
    ),
  ),
);

3.HTTP (dart-lang http package)

1. flutter Bad state: Cannot set the body fields of a Request with content-type “appliction/json

*出现问题的条件

步骤1、使用 ‘dart-lang(dart语言官方)’ 的 ‘http(网络包)’
步骤2、使用 POST 请求方式请求接口
步骤3、使用 POST 请求方式的请求头:”content-type:application/json”,
请求体:

var body = {
    "key":"value",
}
request.body = body;

flutter Bad state: Cannot set the body fields of a Request with content-type “appliction/json

*解决问题的方法

解:使用jsonEncode包装请求体

var body = {
    "key":"value",
}
request.body = jsonEncode(body);

4.Android->Gradle->

1.AndroidX

1.D8: Program type already present: io.flutter.BuildConfig 。
2.D8DexArchiveMerger.mergeDexArchives 。

*出现问题的条件/环境

步骤1、Flutter升级version版本到 version=v1.12.4
步骤2、Android 迁移 AndroidX(Flutter 升级version=v1.12.4后,运行出错:提示Android要迁移到AndroidX)
步骤3、’android包’ 迁移 ‘androidx包’的’Map对照表’ ‘[https://developer.android.com/jetpack/androidx/migrate/class-mappings?hl=en#androidsupporttestrunner]'
步骤4、’包依赖冲突’的错误信息’Program type already present’解决(如果项目依赖了ModelA 和 ModelB,ModelB又依赖了ModelA,那么此时会出现依赖冲突,解决办法:项目只依赖ModelB。参考文档地址:)
步骤5、如果步骤4操作后依然出现’D8: Program type already present: io.flutter.BuildConfig’的错误日志
那么请往下看:
步骤6、’Android gradle version 的兼容、适配、更新’(新建一个flutter项目并运行,如果运行成功,请把新flutter项目的
1、’新项目’中的 android->app->build.gradle文件内的配置更新到’就项目’。
2、’新项目’中的 android->build.gradle文件内的配置更新到’新项目’。
3、’新项目’中的 android->gradle->wrapper->gradle-wrapper.properties文件内的配置更新到’新项目’。
4、’新项目’中的 android->gradle.properties文件内的配置更新到’新项目’。
)

2.代码压缩:R8、Proguard




   转载规则


《Flutter 问题及解决方案汇总.》 Air 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录